package com.tiantang.mybatis.helloworld.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;

import com.tiantang.mybatis.helloworld.domain.Employee;

/**
 * 
 * @description：功能描述 操作t_empolyee表的dao类
 * @author： liujinkun
 * 创建时间： 2018年2月2日
 * @version：1.0
 * Copyright (c) 2018年
 */
public interface EmployeeMapper {

	/**
	 * 
	 * @description：功能描述  根据id查询单个Employee对象
	 * 
	 * @param id
	 * @return
	 * @author： liujinkun
	 * 创建时间： 2018年2月2日
	 * @see： 需要参见的其它内容
	 */
	Employee getEmployeeById(Long id);
	
	/**
	 * 
	 * @description：功能描述 插入一条记录
	 * 
	 * @param employee
	 * @return true：插入成功，false：插入失败 
	 * @author： liujinkun
	 * 创建时间： 2018年2月3日
	 * @see： 需要参见的其它内容
	 */
	Boolean insert(Employee employee);
	
	/**
	 * 
	 * @description：功能描述 根据lastName和性别查询
	 * 
	 * @param firstName	姓
	 * @param gender 性别 0男 ，1女
	 * @return
	 * @author： liujinkun
	 * 创建时间： 2018年2月3日
	 * @see： 需要参见的其它内容
	 */
	Employee getByNameAndGender(@Param("firstName")String firstName,@Param("gender")String gender);
	
	/**
	 * 
	 * @description：功能描述 根据性别查询集合
	 * 
	 * @param gender
	 * @return
	 * @author： TianTang
	 * 创建时间： 2018年2月4日
	 * @see： 需要参见的其它内容
	 */
	List<Employee> getListByGender(String gender);
	
	/**
	 * 
	 * @description：功能描述 根据id获取单条记录，并将查询的数据返回分装成一个Map，键为列名，值为列对应的值
	 * 
	 * @param id
	 * @return
	 * @author： TianTang
	 * 创建时间： 2018年2月4日
	 * @see： 需要参见的其它内容
	 */
	Map<String,Object> getEmployeeReturnMap(Long id);
	
	/**
	 * 
	 * @description：功能描述 根据性别查询多条记录，将多条记录以键为id,值为对象封装成map对象返回
	 * 注解MapKey用来指定key使用哪一个属性来作为key
	 * @param gender 性别，0男，1女
	 * @return
	 * @author： TianTang
	 * 创建时间： 2018年2月4日
	 * @see： 需要参见的其它内容
	 */
	@MapKey(value="id")
	Map<Long,Employee> getByGenderReturnMap(String gender);
	
	/**
	 * 
	 * @description：功能描述 根据员工id查询员工信息，同时级联查询员工所属部门的信息
	 * 
	 * @param id 员工id
	 * @return	Employee 员工详细信息
	 * @author： TianTang
	 * 创建时间： 2018年2月4日
	 * @see： 需要参见的其它内容
	 */
	Employee getEmployeeAndDepartment(Long id);
	
	/**
	 * 
	 * @description：功能描述 根据员工id查询员工信息，分步级联查询员工所属部门的信息
	 * 
	 * @param id 员工id
	 * @return
	 * @author： TianTang
	 * 创建时间： 2018年2月4日
	 * @see： 需要参见的其它内容
	 */
	Employee getEmployeeAndDepartmentByStep(Long id);
	
	/**
	 * 
	 * @description：功能描述 根据部门id查询员工列表集合
	 * 
	 * @param departmentId	部门id
	 * @return
	 * @author： liujinkun
	 * 创建时间： 2018年2月5日
	 * @see： 需要参见的其它内容
	 */
	List<Employee> getEmployeesByDepartmentId(long departmentId);
	
	/**
	 * 
	 * @description：功能描述 通过id以及鉴别器查询员工
	 * 
	 * @param id
	 * @return
	 * @author： TianTang
	 * 创建时间： 2018年2月5日
	 * @see： 需要参见的其它内容
	 */
	Employee getEmployeeByDiscriminator(Long id);

	/**
	 * 
	 * @description：功能描述  根据if标签拼接动态sql查询列表
	 * 
	 * @param employee	封装的查询条件
	 * @return
	 * @author： liujinkun
	 * 创建时间： 2018年2月27日
	 * @see： 需要参见的其它内容
	 */
	List<Employee> selectByIfTag(Employee employee);

	/**
	 * 
	 * @description：功能描述 	根据where标签拼接动态sql
	 * 
	 * @param employee
	 * @return
	 * @author： liujinkun
	 * 创建时间： 2018年3月1日
	 * @see： 需要参见的其它内容
	 */
	List<Employee> selectByWhereTag(Employee employee);

	/**
	 * 
	 * @description：功能描述  根据trim标签拼接动态sql
	 * 
	 * @param employee
	 * @return
	 * @author： liujinkun
	 * 创建时间： 2018年3月1日
	 * @see： 需要参见的其它内容
	 */
	List<Employee> selectByTrimTag(Employee employee);

	/**
	 * 
	 * @description：功能描述 根据choose标签动态拼接sql
	 * 
	 * @param employee
	 * @return
	 * @author： liujinkun
	 * 创建时间： 2018年3月1日
	 * @see： 需要参见的其它内容
	 */
	List<Employee> selectByChooseTag(Employee employee);

	/**
	 * 
	 * @description：功能描述 根据set标签更新表记录
	 * 
	 * @param employee
	 * @return	true:更新成功，false:更新失败
	 * @author： liujinkun
	 * 创建时间： 2018年3月1日
	 * @see： 需要参见的其它内容
	 */
	Boolean updateBySetTag(Employee employee);

	/**
	 * 
	 * @description：功能描述  根据foreach标签动态拼接sql查询列表
	 * 
	 * @param ids
	 * @return
	 * @author： liujinkun
	 * 创建时间： 2018年3月1日
	 * @see： 需要参见的其它内容
	 */
	List<Employee> selectListByForeachTag(@Param("ids") List<Long> ids);

	/**
	 * 
	 * @description：功能描述  根据foreach标签动态拼接sql实现批量插入
	 * 
	 * @param employees
	 * @return 影响的行数
	 * @author： liujinkun
	 * 创建时间： 2018年3月1日
	 * @see： 需要参见的其它内容
	 */
	Integer batchInsert(@Param("employees") List<Employee> employees);
	
	/**
	 * 
	 * @description：功能描述  根据foreach标签动态拼接sql实现批量插入,第二种实现方式。主要区别在mapper.xml文件中
	 * 
	 * @param employees
	 * @return 影响的行数
	 * @author： liujinkun
	 * 创建时间： 2018年3月1日
	 * @see： 需要参见的其它内容
	 */
	Integer batchInsert2(@Param("employees") List<Employee> employees);
}
